package module

//组件次数
type Counts struct {
	Called, Accepted, Completed, Handing uint64
}

//计算组件评分的函数
type CalculateScore func(count Counts) uint64

//组件摘要
type Summary struct {
	ID        string      `json:"id"`
	Called    uint64      `json:"called"`
	Accepted  uint64      `json:"accepted"`
	Completed uint64      `json:"completed"`
	Handing   uint64      `json:"handing"`
	Extra     interface{} `json:"extra"`
}

type Module interface {
	//当前组件ID
	ID() string
	//网络地址的字符串形式
	Addr() string
	//当前组件的评分
	Score() uint64
	//设置当前组件评分
	SetScore(score uint64) CalculateScore
	//获取评分计数器
	ScoreCalculator()
	//当前组件调用次数
	CalledCount() uint64
	//接收调用次数
	AcceptedCount() uint64
	//完成调用次数
	CompletedCount() uint64
	//正在处理调用次数
	HandingCount() uint64
	//一次性获取所有次数
	Counts() Counts
	//组件摘要
	Summary() Summary
}

type Mtype string

//组件ID 生成方法
//  组件类型 + 序列号 + <ip:port>

//当前的组件类型
const (
	//下载器
	TYPE_DOWNLOADER Mtype = "D"
	//分析器
	TYPE_ANALYZER Mtype = "A"
	//条目处理管道
	TYPE_PIPELINE Mtype = "P"
)

//组件MAP
var TypeLetterMap = map[Mtype]string{
	TYPE_ANALYZER:   "A",
	TYPE_DOWNLOADER: "D",
	TYPE_PIPELINE:   "P",
}

//序列号生成接口
type SNGenertor interface {
	//预设的最小序列号
	Start() uint64
	//最大的序列号
	Max() uint64
	//下一个序列号
	Next() uint64
	//循环计数
	CycleCount() uint64
	//获得一个序列号
	GetSN() uint64
}

//组件注册器接口
type Register interface {
	//注册组件实例
	Register(module Module) (bool, error)
	//注销组件实例
	UnRegister(mid string) (bool, error)
	//根据一个组件类型获取权重组件
	GetType(mtype Mtype) (Module, error)
	//根据组件类型获取所有组件
	GetAllByType(mtype Mtype) (map[string]Module, error)
	//获取所有的组件
	GetAll() (map[string]Module, error)

	Clear() (bool, error)
}
